package nexus.com.radio
{
	import nexus.com.radio.interfaces.IRadioButton;
	
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
	
	/**
	 * @author winnie
	 */	
	public class RadioGroup
	{
		private var selectedIndex : int = -1;
		private var radioList : Vector.<IRadioButton> = new Vector.<IRadioButton>();
		
		/**
		 *  <br> RadioGroup </br>
		 *  <br> 라디오 버튼 그룹은 DisplayObject가 아닙니다. </br>
		 *  <br> 라디오 버튼을 자동으로 제어하고자 하시는 분은 객체를 생성하여 버튼을 담아주세요. </br>
		 */
		public function RadioGroup( _radioList:Array = null, _defaultIndex : int = -1  )
		{
			if( _radioList == null ) return;
			
			var len:int = _radioList.length;
			for (var i:int = 0; i < len; i++) 
			{
				addRadioBtnAt( _radioList[ i ], i );
			}
			
			if( _defaultIndex != -1 )
			{
				index = _defaultIndex;
			}
		}
		
		
		
		private function indexSetting():void
		{
			var len:int = radioList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( i == selectedIndex )
				{
					radioList[ i ].select();
				}
				else
				{
					radioList[ i ].deselect();
				}
			}
		}
		
		
		/**
		 * @param idx 0~RadioBtnList length;
		 */		
		public function set index( idx:int ):void
		{
			selectedIndex = idx;
			indexSetting();
		}
		
		
		/**
		 * @return 선택된 라디오의 인덱스 
		 */		
		public function get index():int
		{
			return selectedIndex;
		}
		
		/**
		 * [ 읽기전용 ]
		 * @return 등록된 라디오의 갯수 
		 */		
		public function get length():int
		{
			return radioList.length;
		}
		
		
		/**
		 * @param btn IRadioButton 를 구현한 버튼
		 */		
		public function addRadioBtn( btn : IRadioButton ):void
		{
			addRadioBtnAt( btn, radioList.length );
		}
		
		/**
		 * @param btn IRadioButton 를 구현한 버튼 제거
		 */
		public function removeRadioBtn( btn : IRadioButton ):void
		{
			radioList.fixed = false;
			radioList.splice( radioList.lastIndexOf( btn ), 1 );
			radioList.fixed = true;
		}
		
		/**
		 * @param idx 버튼 인덱스
		 * @return IRadioButton 을 구현한 버튼 반환
		 */		
		public function getRadioBtnAt( idx:int ):IRadioButton
		{
			return radioList[ idx ];
		}
		
		
		/**
		 * @param label 선택할 버튼의 이름
		 * @return IRadioButton 를 구현한 라디오 버튼
		 */		
		public function getRadioBtnAtLabel( label:String ):IRadioButton
		{
			var len:int = radioList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( radioList[i].label == label ) return radioList[i];
			}
			
			return null;
		}
		
		/**
		 * @param btn 끼워넣을 버튼
		 * @param idx 버튼의 인덱스 값
		 */		
		public function addRadioBtnAt( btn:IRadioButton, idx:int ):void
		{
			radioList.fixed = false;
			radioList.splice( idx, 0, btn );
			radioList.fixed = true;
			
			( btn as DisplayObjectContainer ).addEventListener( MouseEvent.CLICK, onRadioBtnClicked );
		}
		
		private function onRadioBtnClicked( e:MouseEvent ):void 
		{
			selectedIndex = radioList.indexOf( e.currentTarget as IRadioButton );
			indexSetting();
		}
	}
}









